Join über gleiche Tabelle

Normalerweise verwendet man einen Join, um mehrere Tabellen miteinander zu verbinden. Man kann ihn jedoch dazu missbrauchen, um unterschiedliche Einträge der gleichen Tabelle zu selektieren!

Ein Anwendungsbeispiel wäre dieses hier: Sie haben einen Fertigungsauftrags und möchten alle Aufträge selektieren, die freigegeben und gedruckt sind.

In der Tabelle JEST steht der Status zum Objekt “Auftrag”. Dabei stehen hier nicht die sprachspezifischen vierstelligen Kürzel FREI und DRUC, sondern die internen Bezeichner I0002 und I0007. Die Umsetzung steht in Tabelle TJ02.

Mithilfe des Alias-Zusatzes beim Join können wir die gleiche Tabelle unter verschiedenen Namen ansprechen:

  SELECT aufk~aufnr aufk~objnr
    INTO TABLE lt_aufnr
    FROM aufk
   INNER JOIN jest AS s_frei ON aufk~objnr = s_frei~objnr
   INNER JOIN jest AS s_druc ON aufk~objnr = s_druc~objnr
   WHERE aufk~auart   = 'ZV01'
     AND s_frei~stat  = 'I0002' AND s_frei~inact = space
     AND s_druc~stat  = 'I0007' AND s_druc~inact = space.
  IF sy-subrc = 0.
    WRITE: / sy-dbcnt, 'Aufträge mit Status FREI DRUC gefunden'.
  ELSE.
    WRITE: / 'Keine Aufträge gefunden mit Status FREI DRUC'.
  ENDIF.

Hinweis:
In diesem speziellen Beispiel müssen Sie allerdings vorsichtig sein! Sie können den Fall nicht umkehren und alle freigegebenen Aufträge suchen, die noch nicht gedruckt wurden! In dem Fall ist nämlich der Status I0007-DRUC nicht zwingend in der Tabelle JEST vorhanden!

Enno Wulff